Data Change Tracking and Event Notification

ABSTRACT

The described implementations relate to updating views in a database system. One implementation can identify an active view that retrieves records from a database and determine one or more physical tables in the database that are referenced by the active view. The implementation can track one or more columns in the physical tables that are used by the active view and identify a change to the physical tables in a transaction log of the database. If the change does not affect the one or more columns, the change can be treated as an ignorable change for the active view.

CROSS-REFERENCE TO RELATED APPLICATIONS

This patent application is a continuation of, and claims priority from,U.S. patent application Ser. No. 13/172,889 filed on Jun. 30, 2011,which is incorporated herein by reference in its entirety.

BACKGROUND

Modern databases can store extraordinary amounts of data, oftenorganized in a multitude of different tables. Users can define viewqueries on these tables that allow the users to distill certain data ofinterest from the database. However, depending on various factors, theview queries can be very computationally intensive and can tend tostrain resources by increasing processor load, memory utilization, diskaccesses, etc.

For example, some view queries are relatively complex, and may access alarge number of tables. Moreover, often there are many different viewqueries being executed frequently by different users. The computationalload caused by complex view queries and/or large numbers of view queriescan be compounded by frequent database record updates, because the viewsgenerally need to be refreshed by executing the view queries whenrecords are added, deleted, or otherwise modified.

SUMMARY

The described implementations relate to databases. One implementationcan identify an active view that retrieves records from a database anddetermine one or more physical tables in the database that arereferenced by the active view. The implementation can also track one ormore columns in the one or more physical tables that are used by theactive view and identify a change to the one or more physical tables ina transaction log of the database. When the change does not affect theone or more columns, the change can be treated as an ignorable changefor the active view.

The above listed examples are intended to provide a quick reference toaid the reader and are not intended to define the scope of the conceptsdescribed herein.

BRIEF DESCRIPTION OF THE DRAWINGS

The accompanying drawings illustrate implementations of the conceptsconveyed in the present patent. Features of the illustratedimplementations can be more readily understood by reference to thefollowing description taken in conjunction with the accompanyingdrawings. Like reference numbers in the various drawings are usedwherever feasible to indicate like elements. Further, the left-mostnumeral of each reference number conveys the Figure and associateddiscussion where the reference number is first introduced.

FIG. 1 shows an example scenario of providing a notification inaccordance with some implementations of the present concepts.

FIG. 2-5 show examples of flowcharts of methods in accordance with someimplementations of the present concepts.

FIGS. 6A and 6B show examples of user interfaces in accordance with someimplementations of the present concepts.

FIG. 7 shows an example of a system in accordance with someimplementations of the present concepts.

DETAILED DESCRIPTION Overview

This discussion relates to updating views in a database system. Forexample, in some implementations the views can be updated by trackingevents in the database and rewriting view queries based on the trackedevents. To provide an updated view, a view query can be rewritten toinclude identifiers of records that have changed over an interval oftime, e.g., since the most recent prior execution of the view query. Therewritten view can retrieve only those records that have changed overthe time interval. Thus, a user may be able to tell, based on theupdated view, which records have changed since the last time the viewwas executed. The disclosed implementations can also be used to providenotifications when the output data of a view query changes.

The disclosed implementations are described in the context of a healthcare scenario. Providing efficient access to updated health care recordscan be a complex problem. For example, there may be many differentsources of patient data, e.g., various hospitals, individual physicians,patient-supplied records, etc. Some of this data may be sensitive, e.g.,a patient's status as an HIV-positive individual needs to be protected.Moreover, many different entities may need access to the records, suchas doctors, medical billing personnel, various software applications,and/or the patients themselves. In some circumstances, near real-timeupdates need to be provided by the database, e.g., information about apatient may need to be provided to a MEDEVAC paramedic without anyperceptible delay.

Health Care Scenario

FIG. 1 illustrates a scenario 100 in which data change tracking andevent notification can be employed. Scenario 100 involves instances 1-3,each of which is discussed below. Starting at instance 1, examplescenario 100 involves a patient 102 that presents for care at anemergency room. In this example, assume that patient 102 is triaged andthat various patient parameters 104 are entered into the patient's filein notebook computer 106 by clinician 108. Notebook computer 106 cansend updates to patient records stored at server 110 in database 112,shown at instance 2. For example, the updates can be based on thepatient parameters entered when the patient is triaged. The patientparameters can include an indication of the patient's symptoms, e.g.,headaches, and an administered treatment, e.g., ibuprofen.

In this example, patient 102 can be thought of as a patient of a generalpractitioner. The general practitioner can practice from an office thatis located remotely from the emergency room, and can subscribe toreceive updates when any current patients of the general practitionerare admitted to another facility for care. Scenario 100 generallyillustrates how the general practitioner can be informed about theirpatient's emergency room visit, e.g., symptoms reported, treatmentsadministered, etc.

For example, event notification module 114 of server 110 can determinethat the general practitioner has subscribed to receive updates relatingto this patient. Thus, the event notification module can send anotification to the general practitioner at their mobile device 116.Mobile device 116 can display a notification 118 that indicates theupdated circumstances of the patient at instance 3.

In this case, event notification module 114 can notify the generalpractitioner using the various techniques discussed below. For example,the general practitioner can subscribe to receive event notificationsbased on changes to the records associated with their patients. Thechanges can cause one or more views to become out of date. Using thetechniques discussed herein, out-of-date views can be filtered andrewritten so they retrieve only out-of-date records. Thus, in theexample of scenario 1, the notification can be provided to the generalpractitioner by executing a view query that is rewritten to include afilter on a patient ID for patient 102. This can offer improvedefficiency relative to, for example, executing a full view query thatretrieves data for all of the general practitioner's patients and thenusing logic to determine which records retrieved by the full view queryhave changed.

Data Change Tracking

The following description will use certain database terminology that isdescribed herein. For the purposes of this document, a base table is atable or view that is explicitly defined in the database schema for thedatabase. Thus, a base table can represent either a view query that isdefined in the schema, or a physical table in the database. A view queryis a table constructed from the base tables by one or more relationaloperations, e.g., JOIN, SELECT, etc. A physical table is an underlyingtable in the database where records are physically stored and updated,and a view query or table is a table that is derived from the data inone or more physical tables. A target query is a view query that isassociated with one or more notifications or events. Generally speaking,when an event such as a change to a physical table in the database wouldresult in a change to the output of a particular target query, acorresponding notification can be generated for entities that areassociated with the target query. One way for an entity to associatewith a target query is via a subscription, discussed in more detailbelow. An active view is a target query that is currently associatedwith at least one entity that is subscribed to receive updates for thatview.

A SQL DOM (structured query language domain object model) is a tree thatdescribes the construction of a query from one or more base tables. ASQL DOM can include one or more classes that load a particular query byparsing a SQL statement. A SQL DOM can be used to rewrite a SQLstatement to include one or more filter conditions, as set forth in moredetail below. Note, however, that other suitable programming languagescan also be used to implement the techniques disclosed herein. Forinstance, some of the concepts described herein can be implemented inthe Java® programming language or using the .NET® framework.

Change data capture (“CDC”) tables are tables that represent changesthat have occurred to physical tables in a database. For example, CDCtables can show what data was included in a given record before andafter each change. The CDC tables can also have timestamps, versionnumbers, or other fields associated with each change that can be used todetermine whether a particular view or individual record is out-of-date.A CDC table is one example of a queryable transaction log of ongoingchanges to a database, and is provided in SQL Server® databaseimplementations. Another example of a queryable transaction log is a“redo” log in an Oracle® database implementation. In someimplementations, queryable transaction logs are themselves implementedas database tables. As discussed in more detail below, using a queryabletransaction log such as a CDC table to update views can be moreefficient than recomputing the entire views directly from the underlyingphysical tables.

For the purposes of example, database 112 can include two tables—PATIENTand ADDRESS, having the following schema:

PATIENT: (PatientID, FirstName, LastName, Phone,  AddressID) ADDRESS:(AddressID, Street, Country, ZipCode)

Thus, PATIENT and ADDRESS are base tables in the database and cangenerally be represented as physical database tables in the database.These tables can be accessed by various view queries, e.g., a view queryVQ1 having the following schema and query definition:

SELECT ZipCode FROM PATIENT p, ADDRESS a WHERE  p.AddressID =a.AddressIDVQ1 provides, as output, a table with all zip codes with at least onepatient. VQ1 is constructed by taking the inner join of PATIENT andADDRESS on the AddressID columns of these tables.

As another example, consider a view query VQ2:

SELECT PatientID, FirstName, Phone FROM PATIENT p,   ADDRESS a WHEREp.AddressID = a.AddressID AND   a.ZipCode = ‘98065’VQ2 provides, as output, the PatientID, FirstName, and Phone columns forthose patients with the zip code 98065.

In some implementations, entities such as users or applications canrequest notifications on a given view query such as VQ1 or VQ2. Forexample, event notification module 114 can be configured to send anotification via an email or API (application programming interface)call whenever patient data changes for a patient living in zip code98065. As mentioned above, those queries that are configured to providesuch notifications are referred to as “target queries.”

Note, however, that some target queries can be computationallyexpensive. If a target query changes frequently because of changes tothe underlying database tables, this can result in many recomputationsof the target query. However, note that not every change to theunderlying database necessarily changes the output of every targetquery.

For example, VQ2 does not return the LastName column of the patienttable, nor is VQ2 conditioned on this column. Thus, even assuming a userin the 98065 zip code changed their last name and a corresponding recordwas updated in the Patient table, VQ2 would still have the same outputbefore and after the update. Thus, another computation of VQ2 does notnecessarily need to be triggered by this particular change to thedatabase. In other words, entities interested in VQ2 do not need to beupdated because of the change to the LastName column. Generallyspeaking, the disclosed implementations can avoid recomputing targetqueries for each change to the underlying tables referenced by thetarget queries. Instead, the recomputations can be limited to instanceswhen the updates to the underlying tables will actually result indifferent results for target queries.

Thus, some changes to the underlying records may not be relevant to anytarget query. For the purposes of this document, such a change isreferred to herein as an “ignorable change.” As another example,consider a change to the Street column of the ADDRESS table. Becausethis column is not referenced in VQ2, this is an ignorable change withrespect to VQ2. Note, however, that changes to either (1) a columnreturned by a query or (2) a column used as a condition in the query cancause the query to need to be recomputed.

First Method Example

FIG. 2 illustrates an exemplary method that can be used to identifyignorable changes. For simplicity of exposition, the following exampleis discussed with respect to a single active view and a single change toa record in one table of the database. However, as discussed in moredetail below, method 200 can be applied for any number of active viewsand for any number of changes to any number of tables in the database.

At block 201, an active view is identified. For example, from a list ofcurrently active views, VQ2 can be identified as an active view. In someimplementations, entities such as the general practitioner can subscribeto receive notifications of updates to the active view, as discussed inmore detail below.

Next, at block 202, the physical database tables that are referenced bythe active view can be determined. For example, VQ2 can be parsed tobuild a SQL DOM that references the physical tables that are accessed byVQ2. Note that, in some circumstances, this might involve recursivelyparsing base tables (SQL Views) until the SQL DOM contains onlyreferences to the underlying physical SQL Tables, as discussed in moredetail below.

Next, at block 203, columns are tracked in the physical tables, e.g.,the columns that are referenced in the active view. For example, as thephysical tables are identified at block 202, event notification module114 can also track the columns that are used in the projections, filtersand join conditions of the active view.

Next, at block 204, a change to the tracked columns can be identified ina transaction log such as the aforementioned CDC tables. For example,event notification module 114 can query the transaction log to findchanges for these columns of the SQL tables that are referenced by VQ2.

If there are changes to the tracked columns, method 200 moves to block205, and the active view is recomputed by executing the view queryagain. Because there are changes to the columns of the physical tablesthat are referenced by VQ2, it follows that at least some of dataretrieved by VQ2 has changed and VQ2 may be recomputed. For example, ifnew records are added to the PATIENT and ADDRESS tables for a patientwith zip code 98065, VQ2 can be recomputed so that the new patientappears in the active view.

Otherwise, if there are no changes to the tracked columns, method 200moves to block 206, and the change is treated as an ignorable change. Asmentioned above, VQ2 does not need to be recomputed if the change in thetransaction log is to the Street column of the ADDRESS table. Thus, fromthe perspective of VQ2, such a change is ignorable.

As mentioned above, method 200 can be performed on multiple views andmultiple changes to multiple physical tables. In such implementations,method 200 can be used to identify changes that may be ignorable for allactive views. Likewise, method 200 can be used to identify a subset ofthe active views that need to be recomputed, while identifying otheractive views that do not need to be recomputed.

Method for Retrieving Changed Records

For those changes that are not ignorable changes (ICs), those physicalrecords that are actually affected by changes to the database can beretrieved to recompute one or more view queries. One way to do so is a“snapshot” approach by executing a view query of interest before andafter one or more changes. The resulting outputs can be “diffed” orcompared to see what view query outputs have changed as a result of thechanges to the underlying database tables. For example, VQ2 could beexecuted before and after a change that adds a new patient with zip code98065. The resulting two tables can be compared to identify the newrecord, and the general practitioner can be sent a notification aboutthe new patient. However, it can be relatively inefficient to execute(1) the full view query for each change to the underlying databasetables and (2) compare the resulting tables, particularly if the viewquery returns a large number of tables.

FIG. 3 illustrates an exemplary method 300 that can be used to update aview. The following implementation can leverage the transaction log tofilter a view query so that the view query will return only thoserecords that have changed as a result of the underlying changes to thedatabase. Again, the following example is discussed with respect to asingle active view and a single change to a record in one table of thedatabase. However, as discussed in more detail below, method 300 can beapplied for any number of active views and for any number of changes toany number of tables in the database.

At block 301, an active view is associated with an entity such as a useror an application. For example, a user can use a graphical userinterface to choose one or more views to monitor, or an application canprogrammatically select one or more views to monitor. When the entitydecides to monitor a particular view, the entity can subscribe toreceive a notification when any data changes on that view. Acorresponding event definition can be created that associates the entitywith the view. For example, the event definition can indicate that thegeneral practitioner should be notified any time a new patient is addedin zip code 98065, is admitted to the emergency room, is administered adrug, etc.

Next, at block 302, view queries can be rewritten using a filtercondition. For example, the transaction log can be accessed to determinewhich records have changed over a given time interval, e.g., since thelast time the entity was notified of a change in the view, the last timethe view query was executed, etc. The view query can be parsed and a SQLDOM can be built that references only the physical tables in thedatabase using one or more of the filter conditions. For example, thefilter conditions can include primary keys extracted from thetransaction log for records that have changed.

The following specific example is discussed in more detail below. Inspecific implementations where a CDC table is being used as thetransaction log, a query such as:

SELECT * FROM Patientscan be rewritten as:

SELECT * FROM (select * from Patients WHERE PatientId IN   ({PrimaryKeys in CDC}))where the filter condition is specified in the rewritten view query viathe underlined portions shown above. Note, however, that the filtercondition identified above is specific to CDC implementations. Moregenerally, the filter condition can be represented in any way thatidentifies the changed rows in the physical tables. For example, inOracle® implementations, primary keys extracted from the redo log can beused as the filter condition in the rewritten query.

Next, at block 303, the rewritten view query can be executed. Becausethe rewritten view query includes the filter conditions from thetransaction log, the rewritten view query will return only those recordsthat have changed since the previous execution of the view query.

Next, at block 304, the changed records are provided to the entity. Insome implementations, method 300 is implemented as a background servicethat periodically rewrites each active view based on the transactionlog. The rewritten views can also be periodically executed by thebackground service. Thus, method 300 can be used to continuouslyidentify relevant events for entities and provide updated results tothose entities. In some implementations, entities can specify how oftenindividual views are recomputed, e.g., in terms of a time interval orfrequency.

Note, however, that method 300 does not need to be performedperiodically. Rather, in some implementations, method 300 can beinitiated each time a database record update is received, or using othercriteria to trigger the method. In such implementations, method 300 canbe initiated responsive to predefined conditions including, but notlimited to, identification of at least one non-ignorable change.

Note also that the keys used for the filter conditions of the rewrittenqueries can be taken from the transaction log instead of directly fromthe underlying physical tables. This can be more efficient than usingthe underlying physical tables, because over a given time interval ofinterest there may be relatively few changed records in the transactionlog, e.g., many fewer records than in the complete physical tables.Moreover, consider using method 300 in the context of a view query thatis built on several other view queries instead of directly on theunderlying physical tables. Because the filter conditions are specifiedin the top-level view query, the filter conditions can be recursivelyfiltered down through the lower-level view queries until a SQL statementreferencing only the physical tables is generated. More generally, eachview query can be associated with one or more intermediate view queriesthat collectively obtain data from one or more physical tables. Notealso that some implementations use an external process to monitorchanges to the physical database tables and the output of this externalprocess can include the primary keys of the changed records.

Specific Examples of Rewritten Queries

Examples of how some of the queries can be rewritten using method 300are shown below using a pseudocode notation based on SQL. The followingcode examples are particular to SQL Server® implementations andaccordingly the rewritten queries shown below reference CDC tables inthe filter conditions. The following examples can be extended to otherimplementations by rewriting the filter conditions to refer to theappropriate transaction log, e.g., a redo log in Oracle®, etc. Note thatthe approach discussed above for identifying changed records can beleveraged to identify changes to records that currently meet the querycriteria. For view queries that select records from multiple physicaltables, one general approach is as follows. For physical tables A, B,and C let deltaA represent changes in the CDC tables to table A, deltaBrepresent changes to table B, and deltaC represent changes to table C. Aunion operation can be used to combine the changes for one table withthe other tables, e.g., following the pattern “deltaA+b+c, a+deltaB+c,a+b+deltaC,” and so on for more tables.

(1) Single Table and no WHERE Clause: Consider a view query that returnsall rows (no WHERE clause) and all columns from the Patients table:

SELECT * FROM PatientsThis query can be rewritten using information from the CDC tables toreturn the query rows that are affected by changes to the underlyingtables, without returning query rows that have not been affected by thechanges to the underlying queries. This can be accomplished by adding anadditional filter on the primary key of the Patients table, e.g.,PatientId, as follows:

SELECT * FROM (select * from Patients WHERE PatientId IN   ({PrimaryKeys in CDC}))By including the primary keys from the changed records in the querycondition “WHERE PatientId IN ({Primary Keys in CDC}),” the changes tothe view query can be identified. Note that this approach can result infewer data accesses (e.g., reads) than would be required to execute theview query before it was rewritten with the primary keys from the CDCtables.

(2) Single Table with WHERE Clause: Now, consider a query that returnsthe Patients living in particular ZipCode using WHERE clause.

SELECT * FROM Patients WHERE ZipCode = ‘98065’This query can be rewritten in the manner discussed above, e.g., usinginformation from the CDC tables to return the affected query rows byadding an additional filter on primary keys using CDC tables as follows:

SELECT * FROM (select * from Patients PatientID IN   ({Primary Keys inCDC} as Patients) WHERE ZipCode   = ‘98065’

(3) Multiple Tables with INNER JOIN: Now, consider a query that uses anInner Join operation to retrieve information from two tables and filtersthe patients using ZipCode:

SELECT * FROM Patients p, Visits v WHERE p.PatientId =   v.PatientId ANDp.ZipCode = ‘98065’This query can be rewritten in the manner discussed above, e.g., usinginformation from the CDC tables to return the affected query rows byadding an additional filter on primary keys using CDC tables. In thisexample, the query is rewritten using a primary key filter for eachtable and then a UNION is used to obtain the complete table:

SELECT * FROM (Select * from   Patients WHERE PatientId IN (Primary Keysin Patients     CDC)) p,   Visits v WHERE p.PatientId = v.PatientId AND    p.ZipCode = ‘98065’ UNION SELECT * FROM Patients p, {Select * fromVisits WHERE VisitId in {Primary Keys in Visits CDC}) v   WHEREp.PatientId = v.PatientId AND p.ZipCode   = ‘98065’

(4) Using LEFT OUTER JOIN: Now, consider a query that uses a LEFT OUTERJOIN operation to get all patients' information and their addresses, ifany:

SELECT * FROM Patient p LEFT OUTER JOIN Address addr   ON p.PatientID= addr.PatientIDQueries using LEFT and/or RIGHT OUTER JOINS can be re-written such thatthe entire table of the non-filtered table is not included, but thefilter column is not eliminated. For example, if the table on thereceiving side of a left/right outer join is not affected by the set ofprimary keys or the table filters, then the table can be eliminated toimprove performance when determining which rows changed:

SELECT * FROM (Select * from Patient (PatientId IN   ({Primary Keys inPatient CDC})) p LEFT OUTER JOIN Address addr ON p.PatientID =  addr.PatientID UNION SELECT * FROM Patient p INNER JOIN {Select * from  Address WHERE AddressID in (Primary Keys in Address CDC}))

(5) Using RIGHT OUTER JOIN: Now, consider a query with multiple RIGHTOUTER JOIN operations:

SELECT * FROM Patient p RIGHT OUTER JOIN Address   addr ON p.PatientID= addr.PatientID RIGHT OUTER JOIN Detail d ON d.PatientID =addr.PatientIDThe RIGHT JOIN after the target table being filtered (“Patient”) can beconverted into Inner Joins as follows:

SELECT * FROM (Select * from Patient (PatientId IN   ({Primary Keys inPatient CDC})) p INNER JOIN Address addr ON p.PatientID = addr.PatientIDINNER JOIN Detail d ON d.PatientID = addr.PatientID UNION SELECT * FROMPatient p RIGHT OUTER JOIN (select * from Address (PatientId IN  ({Primary Keys in Address CDC})) addr ON p.PatientID  = addr.PatientID INNER JOIN Detail d ON d.PatientID = addr.PatientIDUNION SELECT * FROM Patient p RIGHT OUTER JOIN Address addr ONp.PatientID =   addr.PatientID RIGHT OUTER JOIN (select * from Detail(PatientId IN   ({Primary Keys in Detail CDC})) d ON d.PatientID =  addr.PatientID

(6) Full Join: For a FULL JOIN, the query can be rewritten as acombination of LEFT JOIN and RIGHT JOIN operations. If the target tableis on the left side of the JOIN condition, the query can be convertedinto a LEFT JOIN. If the target table is on the right side of the JOINcondition, the query can be converted into a RIGHT JOIN. Any additionalFULL JOIN after the target table can be converted into a LEFT JOIN.

(7) Correlated Sub-Queries #1: The following example shows a sub-querythat retrieves product information for which the product model is a‘blood pressure monitor,’ where the ProductModelID numbers match betweenthe Product and ProductModel tables.

SELECT * FROM Product p WHERE EXISTS (SELECT * FROM ProductModel pmWHERE   p.ProductModelID = pm.ProductModelID AND pm.Name = bloodpressure monitor)This query can be rewritten using information from CDC tables to returnthe affected query rows:

SELECT * FROM {Select * from Product WHERE ProductID IN ({Primary Keysin Product CDC})) p   WHERE EXISTS (SELECT * FROM ProductModel pm WHERE  p.ProductModelID = pm.ProductModelID AND pm.Name = ‘blood pressuremonitor’) UNION SELECT * FROM Product p WHERE EXISTS (SELECT * FROM{Select * from ProductModel WHERE ProductModelID IN (Primary Keys inProductModel   CDC})) pm WHERE p.ProductModelID =   pm.ProductModelIDAND pm.Name = ‘blood pressure monitor’)

(8) Correlated Sub-Queries #2: The following example uses two correlatedsub-queries to find the names of employees who have sold a particularproduct:

SELECT DISTINCT c.LastName, c.FirstName FROM   Person.Contact c JOINHumanResources.Employee e ON e.ContactID =   c.ContactID WHEREEmployeeID IN (   SELECT SalesPersonID FROM   Sales.SalesOrderHeaderWHERE SalesOrderID IN   (   SELECT SalesOrderID   FROMSales.SalesOrderDetail   WHERE ProductID IN ( SELECT ProductID FROMProduction.Product p WHERE   ProductNumber = ‘BK- M68B-42’)   ) )This rewritten query is provided in a manner similar to that discussedabove with respect to the RIGHT OUTER JOIN of example 5.

(9) Using UNION ALL Clause #1: The following examples uses a UNION ALLclause to retrieve and combine records from multiple tables.

SELECT * FROM ProductA UNION ALL SELECT * FROM ProductBThe above query can be re-written as follows to get changed recordsusing information from CDC tables, e.g., if both tables are affected:

SELECT * FROM {Select * from ProductA WHERE ProductID   IN ({PrimaryKeys in ProductA CDC})) UNION ALL SELECT * FROM {Select * from ProductBWHERE ProductID   IN ({Primary Keys in ProductB CDC})

(10) Using UNION ALL Clause #2:

SELECT * FROM ProductA UNION ALL SELECT * FROM ProductBThe above query can be re-written as follows to get changed recordsusing information from CDC tables, e.g., if only one table is changed:

SELECT * FROM {Select * from ProductA WHERE ProductID   IN ({PrimaryKeys in ProductA CDC}) UNION ALL SELECT * FROM {Select * from ProductBWHERE 1 = 2)

Note that the above technique may only find records where the currentvalues of data in the query meet the query criteria and are differentfrom the previous values of data returned by that query. If, however,there are multiple changes to a record between 2 intervals, thisapproach may not identify those records that change back to theirprevious values. For example, if a value X goes from 1 to 10 and back to1 within a specific interval and a view query is used to identifychanged records where X>5, the above rewritten queries may not identifythis change.

This can be problematic in some situations, e.g., if the generalpractitioner wishes to be notified when a patient's blood pressure isout of the normal range, the general practitioner may not be notified ifthe patient's blood pressure goes from normal to out of range and backto normal before the view query is updated. In other words, before theview query is updated, the patient's blood pressure would return tonormal and no change would be identified, and thus the generalpractitioner would be unaware that the patient's blood pressure hadactually gone outside the normal range at some point in time. Thefollowing “complete history” queries are examples of how theabove-identified examples can be rewritten to capture changed data undersuch circumstances.

(1) Single Table and no WHERE Clause:

SELECT * FROM (select * from CDCPatients)

(2) Single Table with WHERE Clause:

SELECT * FROM (select * from CDCPatients as Patients)   WHERE ZipCode =‘98065’

(3) Multiple Tables with INNER JOIN:

SELECT * FROM (Select * from CDCPatients p, (select *   Visits UNION CDCVisits) v WHERE p.PatientId = v.PatientId AND p.ZipCode = ‘98065’ UNIONSELECT * FROM (select * Patients UNION CDCPatients) p,   {Select * fromCDCVisits) v WHERE p.PatientId = v.PatientId AND p.ZipCode = ‘98065’

(4) Using LEFT OUTER JOIN:

SELECT * FROM (Select * from CDCPatient) p LEFT OUTER   JOIN (select *Address UNION CDCAddress) addr ON p.PatientID   =  addr.PatientID UNIONSELECT * FROM (select * Patient UNION CDCPatient) p   INNER JOIN{Select * from CDCAddress)

(5) Multiple RIGHT OUTER JOIN:

SELECT * FROM (Select * from CDCPatient) p INNER JOIN (Select * fromAddress UNION CDCAddress)   addr ON p.PatientID =  addr.PatientID INNERJOIN (Select * from Detail UNION CDCDetail) d ON   d.PatientID =addr.PatientID UNION SELECT * FROM (Select * from Patient UNIONCDCPatient)   p RIGHT OUTER JOIN (select * from CDCAddress) addr ON  p.PatientID =  addr.PatientID INNER JOIN (select * from Detail UNIONCDCDetail) d ON   d.PatientID = addr.PatientID UNION SELECT * FROM(select * from Patient UNION CDCPatient) p  RIGHT OUTER JOIN Addressaddr ON p.PatientID =   addr.PatientID RIGHT OUTER JOIN (select * fromCDCDetail) d ON   d.PatientID = addr.PatientID

(6) For FULL JOIN: A FULL JOIN can be rewritten with RIGHT and LEFTJOIN(s). The RIGHT JOINS can include the rows from the CDC tablerewrite. For example:

SELECT * FROM Patient p FULL JOIN Addr ON p.PatientID =  addr.PatientIDcan be rewritten:

SELECT * FROM (Select * from CDCPatient) p LEFT OUTER   JOIN (select *Address UNION CDCAddress) addr ON p.PatientID =   addr.PatientID UNIONSELECT * FROM (select * Patient UNION CDCPatient) p   RIGHT JOIN{Select * from CDCAddress) addr ON   p.PatientID =  addr.PatientID

(7) Correlated Sub-Queries #1:

SELECT * FROM {Select * from CDCProduct)  p WHERE   EXISTS (SELECT *FROM (select * ProductModel UNION   CDCProductModel) pm WHEREp.ProductModelID = pm.ProductModelID AND pm.Name = ‘blood pressuremonitor’) UNION SELECT * FROM (select * Product UNION CDCProduct) p  WHERE EXISTS (SELECT * FROM {Select * from CDCProductModel) pm WHEREp.ProductModelID = pm.ProductModelID AND pm.Name = ‘blood pressuremonitor’)

(8) Correlated Sub-Queries #2: Again, this can be handled similar toquery described in point #5.

(9) Using UNION ALL Clause #1:

SELECT * FROM {Select * from CDCProductA) UNION ALL SELECT * FROM{Select * from CDCProductB)

(10) Using UNION ALL Clause #2:

SELECT * FROM {Select * from CDCProductA) UNION ALL SELECT * FROM{Select * from CDCProductB)

View Materialization

The above implementations can also be used in the context of viewmaterialization. Materialized views can be created by periodicallyexecuting view queries and caching the results. This can be useful undercircumstances where views are accessed with relatively high frequency,because view requests can be serviced using the materialized tableswithout having to execute the view query for each incoming request.However, under some circumstances, the added efficiencies provided byusing materialized views are not enough. For example, considerenvironments where real-time or near-real time data availability isdesirable (e.g., a hospital environment or financial institution).Periodic execution of view queries under these circumstances necessarilymeans that there are times when the materialized views are out of date.

Techniques similar to those described above with respect to view queriescan also be used to provide updated materialized views. For example, asdiscussed above, the transaction log can be leveraged to selectivelyupdate materialized views. Such implementations can offer improvedefficiencies for maintaining materialized views, because the full viewquery does not need to be re-executed each time the materialized view isupdated.

FIG. 4 illustrates an exemplary method 400 for maintaining amaterialized view table. Again, the following example is discussed witha relatively simple example, e.g., a single materialized view and asingle change to a record in one physical table of the database.However, as discussed in more detail below, method 400 can be appliedfor any number of materialized views and for any number of changes toany number of tables in the database.

A materialized view table is created at block 401. For example, for agiven view query, a corresponding empty table can be created. In someimplementations, the table can initialized by executing the view query afirst time to populate the materialized view table.

Next, altered records in the database can be identified at block 402.For example, as discussed above with respect to methods 200 and 300, atransaction log such as the CDC tables can be used to determine whatchanges have happened to individual records in the physical databasetables. In some implementations, the altered records in the transactionlog are associated with corresponding messages in a message pipeline.Using temporal metadata associated with the messages, altered recordsfor a particular interval of time can be identified. This can limit thenumber of altered records that are applicable to any given update of amaterialized view. Note also that, to further enhance efficiency, block402 can be performed only for changes that are not ignorable changesfrom the perspective of the view query.

Next, rows can be deleted from the materialized view table at block 403.For example, for each altered row ID (e.g., a primary key for a record)in the materialized view table, the entire row can be deleted.

Next, the deleted rows can be reevaluated against the database at block404. For example, the view query can be rewritten as discussed aboveusing the row IDs of the altered records. Thus, the results of theexecuted view query will be limited to the records that have beenupdated since the last time the view query was executed. Accordingly,only the deleted rows are retrieved by the rewritten view query.

Next, the materialized view table is updated at block 405. For example,the records retrieved at block 404 can be inserted into the materializedview table for the deleted row ID's. Accordingly, the materialized viewtable is now up to date with respect to the altered records identifiedat block 402.

Note that the operations discussed above with respect to deleting andinserting rows of the materialized view table can equivalently beperformed by overwriting these rows with the data retrieved at block404, without necessarily deleting these rows from the materialized viewtable. In other words, method 400 can be performed, e.g., using SQLUPDATE statements instead of using DELETE/INSERT statements, etc. Moregenerally, the current state of the materialized view table can beupdated using any acceptable technique to modify the contents of thematerialized view table, including, but not limited to, insertions,deletions, updates, merges, etc.

Note also that, in some implementations, applications may query againstthe materialized table directly instead of against the physical tablesor other views. Thus, view queries against materialized view tables canuse operations such as “SELECT *” from the materialized view table. Alsonote that method 400 can be performed periodically to update thematerialized view table. In some implementations, near real-time updatescan be achieved by setting the update period to relatively shortdurations, e.g., on the order of 10 milliseconds. Method 400 can also beinitiated responsive to detecting any database event that would cause amaterialized view table to be out of date. This can reduce latency evenfurther and can provide real-time levels of performance.

In still further implementations, the frequency with which a givenmaterialized view is updated can depend on the relative importance ofhaving up-to-date data in the table. For example, in an operating roomor MEDEVAC scenario, a health care professional may need to know withcomplete certainty that certain patient information is not stale. Insuch implementations, 10 millisecond refresh intervals for thematerialized view table might be reasonable. For a general practitionerscheduling regular office visits for patients, overnight updates may besufficient to keep a reasonably up-to-date schedule.

As an example of how the above discussion can be employed in scenario100, mobile device 116 can include an application that queries againstone or more materialized tables in database 112. The application can beconfigured to retrieve and format columns from the materialized tablesin a user-friendly fashion. For example, the application can list theretrieved information in an order such as (1) whether the patient ispresently admitted for treatment, (2) the patient's symptoms, and (3)any treatments administered to the patient, as shown in notification118.

In scenario 100, the message pipeline can include messages sent fromnotebook computer 106 to database 112, as well as various other devicesthat can update database 112, e.g., other hospitals, insurancecompanies, etc. In some implementations, each message in the pipeline isgiven a sequentially-increasing message ID. These message ID's can serveas temporal metadata because, as between any two messages, the messagewith the higher message ID was received by database 112 later than themessage with the lower message ID.

Each message can cause changes to the physical database tables. In someimplementations, any message ID that alters a physical database tableresults in a new sequential Row ID. Thus, for any interval of interest,the records that were altered during that interval can be identifiedusing the message ID's and/or the row ID's. Note also that timestampscan also be used in addition to, or in place of, the sequential messageand row ID's.

Using the techniques described above with respect to method 400, themessages in the message pipeline can be used to define which primarykeys are extracted from the transaction log and used as filterconditions on the rewritten queries. Thus, the messages in the pipelineconstrain which primary keys are used for each update to a givenmaterialized view. Because this can mean that relatively few records mayneed to be updated, it is possible to provide a low-latency solution viathe materialized view tables.

Event Subscriptions

The above implementations can provide efficient techniques for providingupdated data to various users. In some cases, many different users areconstantly receiving different data streams to update different views ofthe underlying records. As mentioned above, users can be notified whenparticular views of interest are updated.

However, it is not always feasible for users to register to be notifiedin every conceivable instance that would be of interest to the user. Forexample, assume the general practitioner wishes to register fornotifications whenever one of their patients is prescribed anymedication from a class of medications, e.g., non-steroidalanti-inflammatory drugs or NSAIDS. There may be hundreds of differentdrugs in this particular class. It would be relatively burdensome torequire the physician to request an individual notification for each andevery NSAID drug. Moreover, in the event a new NSAID drug was approvedfor use by a regulatory agency, the physician may not even be aware thatthe newly-approved drug is available and therefore may not realize thathe/she needs to add a new notification on this drug.

The following implementations can facilitate providing users withsubscription mechanisms to obtain data of interest without having toregister notifications with such particularity. For example, users canregister subscriptions such that they are notified when data fallswithin a particular range, when correlated events occur, when certainevents do not occur, etc. Users can also subscribe to be notified ofchanges in the data that relate to certain concepts, e.g., theaforementioned physician could register to be notified based on apredefined concept such as “NSAID drugs,” etc. Users can also subscribevia free-form keywords, e.g., in instances when there is not a suitablepredefined concept available.

FIG. 5 illustrates an exemplary method that can be used to notify a userthat has registered a subscription. The following discussion withrespect to FIG. 5 is general in nature. More specific implementationsfollow that identify details of how different types of subscriptions canbe implemented consistently with method 500. In the following example,database 112 is a health care database that includes one or morepersonal health care records such as an individual patient record forpatient 102.

At block 501, an entity can register a subscription. For example, theentity could be a user such as the aforementioned general practitioner,a nurse, a group of individuals, or a non-human entity such as anapplication. The subscription can be stored in association with theentity.

Next, at block 502, the subscription is associated with a health careconcept. Generally speaking, this can involve storing identifiers inassociation with the subscription, such as one or more identifiers ofdata for which the entity would like to receive notifications. Forexample, in the example of the physician mentioned above, the identifier“NSAID drugs” could be stored in association with the physician'ssubscription. As discussed in more detail below, the subscription can beused to notify the entity when data in a personal health care record isupdated in a health care database. Thus, the identifier can relate to ahealth care concept, in this case, “NSAID drugs.” Note that theidentifier “NSAID drugs” can be viewed as a contextual identifiercorresponding to a multitude of different drugs in the NSAID class. Insome implementations, the identifier can be expanded, e.g., to a list ofeach of the different NSAID drugs (e.g., aspirin, ibuprofen, etc), andeach individual drug can be associated with the subscription.

Next, at block 503, a notification can be triggered responsive to anupdated data value. For example, if a personal health care record isupdated by a change to a physical table or view in the database suchthat the personal health care record includes one of the drugs on thelist, a notification can be triggered. Note that the notification can betriggered without directly accessing the physical database tables.Instead, the transaction log can be used to detect the updated datavalue and trigger the notification. Furthermore, in someimplementations, the updated data is not yet persisted in the databasewhen the notification is triggered. Instead, for example, a softwaremethod that updates the database (e.g., via embedded SQL, etc.) can beconfigured with logic to trigger the notification before updating thedatabase, e.g., by checking for a value or particular range of valuesbefore the database is updated.

Next, at block 504, an authorization level for the entity can bedetermined. For example, a physician may have access to see all drugstaken by any of their patients. However, this information may not beavailable to other individuals, e.g., medical billing personnel, etc.

Next, at block 505, updated data relating to the personal health recordis provided to the entity by sending the notification via an appropriatechannel, provided the entity is authorized. For example, drugs used bypatients may be considered sensitive data. Accordingly, it may beinappropriate to send information that a patient has started usingaspirin via an unsecure channel such as an unencrypted text message.Instead, for example, this information could be provided via a moresecure channel, such as an encrypted email. In contrast, for example,information about a patient rescheduling an appointment could beappropriate for providing to the general practitioner via less securechannels such as the aforementioned text message.

In some implementations, method 500 can be viewed as allowing the entityto register a context-sensitive subscription that allows the entity touse predefined notification concepts such as the aforementionedpredefined mappings of drug classes to individual drugs. Method 500 canalso be implemented using free-form notification concepts. For example,the general practitioner could provide one or more keywords at block 501that are used at block 502 to determine the associated data values. As aspecific example, even if there is no predefined mapping from “NSAID” to“ibuprofen,” it is still likely that a keyword search on “NSAID” wouldreturn search results with the term “ibuprofen.” Conceptual notificationschemes using keywords can be implemented by using the keyword to searcha corpus of documents and identifying related terms, e.g., the keyword“NSAID” may return the related terms “ibuprofen,” “aspirin,” etc. Insuch implementations, the general practitioner can be alerted whenupdates to the database include the related terms but do not necessarilyinclude the keyword itself.

In still further implementations, block 501 can allow the entity toregister a subscription that references a defined range of values. Forexample, the defined range could be a total cholesterol measurement fora patient. Note that the range does not necessarily need to be definedon columns that are present in the physical database tables. Forexample, the total cholesterol value may not be represented in thephysical database tables, but instead could be determined by a viewquery that sums together two physical columns in the database, e.g.,low-density lipoprotein (LDL) and high-density lipoprotein (HDL)columns.

Method 500 can also leverage codified medical data in someimplementations. For example, the physical records in the database mayinclude a predefined code for the drug “ibuprofen.” Block 502 of method500 can associate the general practitioner's subscription request for“ibuprofen” with the predefined code. This is another example of hownotification can be accomplished even in circumstances where theunderlying physical records do not include the concepts of interest tothe subscribing entity. As another example, synonymous terms can bemapped at block 502, so, for example, an entity registering to receive anotification on a medication such as “ibuprofen” can receive anotification on a corresponding brand name, e.g., Motrin®. Note that theopposite is also true, e.g., the entity could register a subscriptionfor the brand name and receive notifications when the generic drug nameappears in one or more records.

As another example, the subscription mechanisms presented herein can beused to correlate multiple events. The correlated events do notnecessarily need any predefined relationship in the underlying physicalrecords and/or any view queries. For example, the general practitionercould register to receive a notification on the concepts “ibuprofen” and“pain” any time these two concepts are reflected in updates to thedatabase within a predefined time interval, e.g., one day. The concept“ibuprofen” could be expanded or mapped to a brand name as mentionedabove, and the concept “pain” could be mapped to a “headache.” Thus, thephysical database records could be updated with the values “Motrin®” and“headache” within 24 hours for a particular patient. The generalpractitioner would receive a corresponding notification, e.g., as shownin scenario 100, even though the general practitioner did not explicitlyidentify Motrin® and/or headaches as concepts of interest. This approachcan be applied to other types of medical data, e.g., lab results, familyhistories, surgeries, occurrence or non-occurrence of events such astaking medication, etc.

In still further implementations, statistical techniques can be used todetermine notification concepts that can be used to implementsubscriptions for different entities. For example, certain values in thephysical records or derived values in the views may tend to bestatistically correlated. In other words, the drug acetaminophen is notconsidered an NSAID. However, acetaminophen can be used in many clinicalcontexts where an NSAID such as aspirin or ibuprofen would also beappropriate. In some implementations, subscribers may be able tosubscribe for notifications on closely-related concepts. For example, asubscribing entity that requests notifications on “NSAIDs” could begiven an option to also receive notifications on statistically-relatedconcepts. In scenario 100, if the general practitioner has selected thisoption, the general practitioner may receive a notification when thepatient receives acetaminophen even though the concept that theyspecified, NSAIDs, does not strictly include acetaminophen. In contrast,had the general practitioner not selected this option, then they wouldnot be notified if the patient were to receive acetaminophen because thenotifications would be strictly limited to instances where NSAIDs wereused.

Note that method 500 can be integrated with methods 200, 300, and/or 400described above. For example, ignorable changes can be identified notonly for individual view queries, but also for conceptual notificationschemes that are not directly reflected by any particular view query. Asbut one example, in the NSAID scenario discussed above, there may be afirst view query that selects patient records on all NSAID medicationsby an expanded list of all known NSAID drugs. There may be a second viewquery that selects patient records that include the term acetaminophen.From the perspective of this subscription, an ignorable change is achange that is ignorable for both of these view queries. However, if thechange necessitates recalculating either of these two view queries, anappropriate notification can be generated using a rewritten view query.Likewise, note that the notification can, in some implementations, begenerated by querying the materialized view tables instead of thephysical tables.

From some perspectives, the keys used for the rewritten view queriesmentioned above can be viewed as context-based keys. For example, thetransaction log can be searched for changes that meet criteria definedby the subscription, e.g., data within a particular range, data that issynonymous with a subscribed concept, etc. The primary keys selectedfrom the records in the transaction log are therefore selected based oncontext that is defined at least partly by the subscription.

In some implementations, notifications provided, e.g., by block 505 ofmethod 500 are context-aware. One example is mentioned above withrespect to using encrypted email for providing confidential informationsuch as what drugs a patient may be taking. More generally, differentsubscribers can have different roles with different permissions. Forexample, the roles of “physician,” “nurse, and “billing personnel” canhave progressively decreasing permissions. Entities with the role ofphysician can have access to all medical data for their patients, e.g.,lab results, symptom information, etc. Nurses may not have access to labresults but may have access to symptom information. Billing personnelmay not have access to either, and may only have access to informationsuch as codes for procedures performed, insurance information, etc.

In further implementations, relationships between a triggering entityand a receiving entity can be used to refine which data is provided to aparticular entity. As mentioned above, the general practitioner(receiving entity) can receive updates when their own patients(triggering entity) check into the emergency room, but not necessarilyfor all patients who happen to check into the emergency room. In someimplementations, different priorities are defined for different users.As suggested above, the frequency of updates provided to a MEDEVACparamedic may be far more frequent than the frequency of updatesprovided to a general practitioner, for reasons related to the relativeurgency associated with these differing roles. Note also that active ormaterialized views associated with a high-priority entity can be updatedmore frequently than active or materialized views associated with alower-priority entity.

In some implementations, delivery channels with relatively low latencycan be used to deliver messages to higher-priority recipients, whiledelivery channels with relatively high latency can be used to delivermessages to lower-priority recipients. A cardiac surgeon performingsurgery on a patient the same day could be a higher priority recipientof an event notification compared to the patient's general practitioner.This could mean that the general practitioner gets an e-mail report atthe end of the week, while the surgeon could receive a short messageservice (“SMS”) message, a page, an e-mail, and a custom notification inan inbox that is associated with the health care database. Additionally,the surgeon's operating room assistants can also be notified byrelatively low-latency channels such as the aforementioned SMS message.

As also mentioned above, different delivery channels may be moreappropriate for different types of information. For example, someinformation such as HIV status may be categorically prohibited frombeing communicated via unencrypted communications. Other, less sensitiveinformation such as patient appointments can be provided to differentindividuals on a role-specific basis. For example, administrativepersonnel may only have access to patient appointments at a fixedworkstation at their office, whereas physicians may receive patientappointments around the clock on a calendar application of their mobiledevice.

In some implementations, the particular data that is provided for agiven notification is a function of the delivery channel. For example,the general practitioner may have a secure office computer as well as aless-secure mobile device. In scenario 100, the notification sent to thegeneral practitioner's mobile device could be limited to anidentification of the patient that was admitted to the emergency room.To determine the particular symptoms and treatments, the generalpractitioner may have to either enter a password into their mobiledevice to initiate an encrypted session, or go to their office andobtain the information from their work computer.

Example GUIs

FIGS. 6A and 6B illustrate exemplary GUIs that can be provided for userregistration of subscription concepts. FIG. 6A illustrates a GUI 600that can be employed to allow a user to select two predefinednotification concepts, selected respectively from drop-down menus 601and 602. For example, GUI 600 could be employed in advance of scenario100 to allow the general practitioner to receive notification 118 atinstance 3. In FIG. 6A, the general practitioner can select onepredefined concept for “NSAIDS” and another predefined concept for“pain.” If the general practitioner wishes to be notified onstatistically-correlated concepts, the general practitioner can alsoselect boxes 603 and 604, respectively. By selecting button 605, thegeneral practitioner can submit a subscription message to the databasewhich can then monitor the data in the database for updates that triggera notification for the subscription.

FIG. 6B illustrates GUI 600 in a different configuration where a keywordconcept replaces predefined concept 2. Here, GUI 600 is shown with atext entry block 606, where the general practitioner can enter afreeform keyword instead of selecting from an available predefinedconcept. For example, by entering the keyword “fever” instead of themore general predefined concept “pain,” the general practitioner canlimit the notifications they receive to instances when their patientsare admitted to the ER with a fever instead of for general pain. Notethat in some implementations the keyword concept “fever” can be expandedto include a range of values, e.g., 101-108 degrees Fahrenheit bodytemperature, etc. Accordingly, method 500 can trigger a notificationwhen an individual record in the transaction log reflects a bodytemperature in this range.

System Example

FIG. 7 shows an example of a system 700. Example system 700 includes oneor more client device(s) 702, shown as a notebook client device 702(1)and a mobile client device 702(2), respectively. In this case, clientdevice(s) 702 can each include a processor 704, storage 706, and asubscription module 708. (A suffix ‘(1)’ is utilized to indicate anoccurrence of these modules on client device 702(1) and a suffix ‘(2)’is utilized to indicate an occurrence on client device 702(2)).

System 700 can also include one or more server(s) 710. Server(s) 710 canbe a computing device that also includes a processor 704(3) and storage706(3). Note the suffix (3) is used to indicate an occurrence of aprocessor or storage on server 710. Server 710 can also include an eventnotification module 712, which can include submodules such as filtermodule 714, rewrite module 716, materialization module 718, and/orsubscription module 720. System 700 can also include storage resources722, which can include one or more storage devices configured to storethe physical database tables mentioned above.

Client device(s) 702, server 710, and storage resources 722 cancommunicate over one or more networks 724, such as, but not limited to,the Internet. Modules 708 and 712-720 can be implemented as software,hardware, and/or firmware. Processor(s) 704 can execute data in the formof computer-readable instructions to provide a functionality. Data, suchas computer-readable instructions, can be stored on storage 706. Thestorage can include any one or more of volatile or non-volatile memory,hard drives, and/or optical storage devices (e.g., CDs, DVDs etc.),among others. Client device(s) 702 and server 710 can also be configuredto receive and/or generate data in the form of computer-readableinstructions from an external storage 726.

Examples of external storage 726 can include optical storage devices(e.g., CDs, DVDs etc.), hard drives, and flash storage devices (e.g.,memory sticks or memory cards), among others. In some cases, modulesdiscussed herein can be installed on the client devices or server duringassembly or at least prior to delivery to the user. In other scenarios,the modules discussed herein can be installed by the user afterdelivery, such as a download available over network 724 and/or fromexternal storage 726. The modules discussed herein can be manifest asfreestanding applications, application parts and/or part of thecomputing device's operating system.

Collectively, the modules discussed herein can achieve the functionalitydescribed above relative to FIGS. 1-6. For example, filter module 714can be configured to implement method 200, rewrite module 716 can beconfigured to implement method 300, materialization module 718 can beconfigured to implement method 400, and subscription module 720 can beconfigured to implement method 500. It is worth noting that in someinstances, the client devices or servers can comprise multiple computingdevices or machines, such as in a distributed environment. In such aconfiguration, methods 200-500 can be implemented using distributedprocessing across the multiple computing devices or machines.

The terms “computer,” “client device,” “server” and “computing device”as used herein can mean any type of device that has some amount ofprocessing capability and/or storage capability. Processing capabilitycan be provided by one or more processors that can execute data in theform of computer-readable instructions to provide a functionality. Data,such as computer-readable instructions, can be stored on storage. Thestorage can be internal and/or external to the computing device. Thestorage can include any one or more of volatile or non-volatile memory,hard drives, flash storage devices, and/or optical storage devices(e.g., CDs, DVDs etc.), among others. As used herein, the term“computer-readable media” can include transitory and non-transitorycomputer-readable instructions. In contrast, the term “computer-readablestorage media” excludes transitory instances. Computer-readable storagemedia includes “computer-readable storage devices”. Examples ofcomputer-readable storage devices include volatile storage media, suchas RAM, and non-volatile storage media, such as hard drives, opticaldiscs, and flash memory, among others.

Examples of computing devices can include traditional computing devices,such as personal computers, cell phones, smart phones, personal digitalassistants, or any of a myriad of ever-evolving or yet to be developedtypes of computing devices. Further, aspects of system 700 can bemanifest on a single computing device or distributed over multiplecomputing devices.

CONCLUSION

The order in which the example methods are described is not intended tobe construed as a limitation, and any number of the described blocks orsteps can be combined in any order to implement the methods, oralternate methods. Furthermore, the methods can be implemented in anysuitable hardware, software, firmware, or combination thereof, such thata computing device can implement the methods. In one case, the methodsare stored on one or more computer-readable storage media as a set ofinstructions such that execution by one or more computing devices causesthe one or more computing devices to perform the method.

Although techniques, methods, devices, systems, etc., pertaining tosecure patient information handling are described in language specificto structural features and/or methodological acts, it is to beunderstood that the subject matter defined in the appended claims is notnecessarily limited to the specific features or acts described. Rather,the specific features and acts are disclosed as exemplary forms ofimplementing the claimed methods, devices, systems, etc.

1-21. (canceled)
 22. A method comprising: registering a subscription foran entity to receive a notification relating to a personal health carerecord stored in a health care database; associating the subscriptionwith a health care concept; and in an instance when a transaction log ofthe health care database is updated to include a value that relates tothe health care concept, sending the notification to the entity.
 23. Themethod according to claim 22, wherein the associating comprises storing,in association with the subscription, one or more identifiers of datafor which the entity will receive notifications.
 24. The methodaccording to claim 23, further comprising expanding an individualidentifier to a plurality of different values.
 25. The method accordingto claim 24, wherein the individual identifier comprises a keyword andthe plurality of different values comprise terms that are related to thekeyword.
 26. The method according to claim 22, wherein the subscriptionis associated with a defined range of values, and the value is withinthe defined range of values.
 27. The method according to claim 22,wherein the health care concept comprises a predefined code for a drugand the value comprises a brand name for the drug.
 28. The methodaccording to claim 22, wherein the health care concept comprises a brandname for a drug and the value comprises a predefined code for the drug.29. One or more computer-readable storage media comprisingcomputer-readable instructions which, when executed by one or morecomputing devices, cause the one or more computing devices to perform:registering a first subscription for a first entity to receive a firstnotification relating to a personal health care record stored in ahealth care database, the first entity having a first role; registeringa second subscription for a second entity to receive a secondnotification relating to the personal health care record, the secondentity having a second role; associating the first subscription and thesecond subscription with a health care concept; and responsive todetermining that the health care database is being updated to include avalue that relates to the health care concept, sending the firstnotification to the first entity and the second notification to thesecond entity.
 30. The one or more computer-readable storage mediaaccording to claim 29, the first role reflecting that the first entityis a physician.
 31. The one or more computer-readable storage mediaaccording to claim 30, the second role reflecting that the second entityis a nurse.
 32. The one or more computer-readable storage mediaaccording to claim 31, wherein the first notification includes at leastsome data from the personal health care record that is provided to thephysician but that is not provided in the second notification to thenurse.
 33. The one or more computer-readable storage media according toclaim 29, wherein the health care concept reflects patients of aphysician and the value identifies an individual one of the patients.34. The one or more computer-readable storage media according to claim31, wherein at least one of the first notification or the secondnotification is sent before the value is persisted in the health caredatabase.
 35. A system comprising: a subscription module configured to:register a subscription for an entity to receive a notification relatingto a personal health care record stored in a health care database;associate the subscription with a health care concept; detect an updateddata value for the personal health care record, the updated data valuebeing associated with the health care concept; responsive to the updateddata value being detected, trigger the notification to be sent to theentity; and provide the notification to the entity by sending thenotification to the entity via a delivery channel; and one or moreprocessors configured to execute the subscription module.
 36. The systemaccording to claim 35, wherein the subscription module is configured toexclude particular data from the notification in instances when thedelivery channel is relatively less secure, and include the particulardata in other instances when the delivery channel is relatively moresecure.
 37. The system according to claim 36, wherein: the instanceswhen the delivery channel is relatively less secure comprise instanceswhen the delivery channel is unencrypted, and the other instances whenthe delivery channel is relatively more secure comprise instances whenthe delivery channel is encrypted.
 38. The system according to claim 37,wherein, in the instances when the delivery channel is unencrypted, thesubscription module is configured to exclude patient drug informationfrom the notification.
 39. The system according to claim 38, wherein, inthe other instances when the delivery channel is encrypted, thesubscription module is configured to include the patient druginformation in the notification.
 40. The system according to claim 36,wherein the particular data excluded from the notification comprisessymptoms of the patient.
 41. The system according to claim 35, whereinthe subscription module is configured to send the notification to ageneral practitioner via a mobile device when a patient of the generalpractitioner is admitted to a health care facility, and require thegeneral practitioner to enter a password before providing the generalpractitioner with symptoms of the patient.